想要改善這篇文章嗎?提供此問題的詳細答案,包括引文和為什麼答案正確的解釋。答案不夠詳細的答案可能會被編輯或刪除。 我錯誤地使用以下命令將文件添加到了Git: git添加myfile.txt 我還沒有運行git commit。有一種方法可以撤消此操作,以便這些文件不會包含在提交中?
1個 2 下一個 您可以在提交之前撤消git add git reset <文件> 這會將其從當前索引(“即將提交”列表)中刪除,而無需進行其他任何更改。 您可以使用 git重置 沒有任何文件名可以取消所有應有的更改。當在合理的時間內有太多文件不能一一列出時,這可能會派上用場。 在舊版本的Git中,上述命令分別等效於git reset HEAD和git reset HEAD,如果HEAD未定義(因為尚未在存儲庫中進行任何提交)或模棱兩可(因為創建了一個名為HEAD的分支,這是愚蠢的事情,您不應該這樣做)。不過,在Git 1.8.2中已對此進行了更改,因此在現代版本的Git中,甚至可以在進行首次提交之前使用上述命令: “ git reset”(無選項或參數)用於在以下情況下出錯 您的歷史記錄中沒有任何提交,但是現在可以給您 空索引(為了匹配不存在的提交,您甚至都沒有參與)。 文檔:git reset | 你要: git rm --cached <添加文件到_撤消> 推理: 當我是新手時,我首先嘗試 git reset。 (撤消我的整個初始添加),只是得到了此消息(不是這樣),有幫助: 致命的:無法將“ HEAD”解析為有效的參考。 事實證明,這是因為HEAD ref(分支?)在第一次提交之後才存在。也就是說,如果您的工作流程(例如我的工作流程)類似於: cd到我偉大的新項目目錄中,嘗試Git,新熱點 git初始化 git添加 git狀態 ...很多廢話 =>該死,我不想添加所有內容。 谷歌“撤消git添加” =>查找堆棧溢出-是 git reset。 =>致命:無法將“ HEAD”解析為有效的引用。 事實證明,在郵件列表中有一個針對此問題的日誌記錄了一個錯誤。 而且正確的解決方案就在Git狀態輸出中(是的,我掩飾為“廢話”) ... #要提交的更改: #(使用“ git rm --cached <文件> ...”取消登台) ... 解決方案的確是使用git rm --cached FILE。 注意此處其他地方的警告-git rm刪除文件的本地工作副本,但如果使用--cached則不會刪除。這是git help rm的結果: -緩存 使用此選項可以取消登台並僅從索引中刪除路徑。 無論是否修改,都會保留工作樹文件。 我繼續使用 git rm-緩存 刪除所有內容,然後重新開始。不過沒有用,因為在添加時。是遞歸的,結果表明rm需要-r來遞歸。嘆。 git rm -r --cached。 好的,現在我回到了起點。下次,我將使用-n進行空運行並查看將添加的內容: git add -n 在信任git help rm關於--cached不會破壞任何內容(以及我拼錯的內容該怎麼辦)之前,我將所有內容壓縮到一個安全的地方。 | 如果輸入: git狀態 Git會告訴您已登台的內容等,包括有關如何登台的說明: 使用“ git reset HEAD <文件> ...”取消登台 我發現Git在這種情況下勉強讓我做正確的事情做得很好。 注意:最新的Git版本(1.8.4.x)更改了此消息: (使用“ git rm --cached <文件> ...”取消登台) | 需要說明的是:git add將更改從當前工作目錄移動到暫存區(索引)。 此過程稱為暫存。因此,進行更改(更改文件)的最自然的命令是顯而易見的命令: git階段 git add只是git stage易於使用的別名 可惜沒有git unstage或git unadd命令。相關的難以猜測或記住,但很明顯: git reset HEAD- 我們可以輕鬆為此創建一個別名: git config --global alias.unadd'重置頭-' git config --global alias.unstage'重置頭-' 最後,我們有了新命令: git添加文件1 git stage file2 git unadd file2 git unstage file1 我個人使用更短的別名: git a#用於暫存 git u#用於暫存 | 除了已接受的答案之外,如果錯誤添加的文件很大,您可能會注意到,即使使用'git reset'將其從索引中刪除後,它似乎仍然佔據.git目錄中的空間。 這沒什麼好擔心的。該文件確實仍在存儲庫中,但僅作為“鬆散對象”。不會將其複製到其他存儲庫(通過克隆,推送),最終將回收該空間-儘管可能不會很快。如果您著急,可以運行: git gc --prune =現在 更新(以下是我嘗試清除最受好評的答案可能引起的一些混淆): 那麼,哪個是git add的真正撤消? git reset HEAD <文件> 要么 git rm --cached <文件>? 嚴格來說,如果我沒有記錯的話:沒有。 git add無法撤消-通常來說是安全的。 讓我們首先回顧一下git add 的實際作用: 如果以前未跟踪 ,則git add將其添加到緩存及其當前內容。 如果已經跟踪了 ,則git add將當前內容(快照,版本)保存到緩存中。在Git中,此操作仍稱為添加(而不只是更新),因為文件的兩個不同版本(快照)被視為兩個不同的項目:因此,我們的確是向緩存中添加了一個新項目,最終以後提交。 鑑於此,這個問題有點模棱兩可: 我錯誤地使用命令添加了文件... OP的情況似乎是第一個(未跟踪的文件),我們希望“撤消”從跟踪的項目中刪除文件(而不僅僅是當前內容)。如果是這種情況,則可以運行git rm --cached 。 我們還可以運行git reset HEAD 。通常,這是可取的,因為它在兩種情況下都有效:當我們錯誤地添加已經跟踪的項目的版本時,它也會撤消操作。 但是有兩個警告。 第一:(在答案中指出)只有一種情況,其中git reset HEAD不起作用,但是git rm --cached起作用:新的存儲庫(無提交)。但是,實際上,這實際上是無關緊要的情況。 其次:請注意git reset HEAD不能神奇地恢復以前緩存的文件內容,它只是與HEAD重新同步。如果我們誤導的git add覆蓋了先前暫存的未提交版本,我們將無法恢復它。因此,嚴格來說,這是我們不能撤消[*]的原因。 例: $ git init $ echo“版本1”> file.txt $ git add file.txt#第一次添加file.txt $ git commit -m'第一次提交' $ echo“版本2”> file.txt $ git add file.txt#階段(不要提交)file.txt的“版本2” $ git diff --cached file.txt 版本1 +版本2 $ echo“版本3”> file.txt $ git diff file.txt 版本2 +版本3 $ git add file.txt#糟糕,我們不是這個意思 $ git reset HEAD file.txt#撤消嗎? $ git diff --cached file.txt#當然沒有dif。階段== HEAD $ git diff file.txt#我們不可挽回地丟失了“版本2” 版本1 +版本3 當然,如果僅遵循通常的懶惰工作流(僅用於添加新文件)進行“ git add”(案例1),然後通過commit git commit -a命令更新新內容,這並不是很關鍵。 *(編輯:以上內容實際上是正確的,但是仍然可能有一些稍作修改/令人費解的方法來恢復已上演但未提交但隨後被覆蓋的更改-請參閱Johannes Matokic和iolsmit的評論) | 使用Git撤消已經添加的文件非常容易。要重置已添加的myfile.txt,請使用: git reset HEAD myfile.txt 說明: 暫存不需要的文件後,要撤消,可以執行git reset。 Head是本地文件的頭,最後一個參數是文件名。 我已為您在下圖中創建了更詳細的步驟,包括在這些情況下可能發生的所有步驟: | git rm-緩存-r 將遞歸“取消添加”從當前目錄添加的所有內容 | 跑 git gui 並手動刪除所有文件,或選擇所有文件並單擊“從提交取消登台”按鈕。 | 這個問題沒有明確提出。原因是git add具有兩個含義: 在登台區域添加一個新文件,然後使用git rm --cached文件撤消。 將一個已修改的文件添加到暫存區域,然後使用git reset HEAD文件撤消。 如有疑問,請使用 git reset HEAD文件 因為在兩種情況下都可以完成預期的操作。 警告:如果對修改過的文件(倉庫中以前存在的文件)執行git rm --cached文件,則在git commit時將刪除該文件!它仍然存在於您的文件系統中,但是如果其他人拉您的提交,該文件將從他們的工作樹中刪除。 git status會告訴您該文件是新文件還是已修改的文件: 在分支機構主管 所做更改: (使用“ git reset HEAD <文件> ...”取消登台) 新文件:my_new_file.txt 已修改:my_modified_file.txt | Git擁有可以想像的每一個動作的命令,但是它需要廣泛的知識來使事情變得正確,因此它充其量是違反直覺的…… 您之前做了什麼: 更改了文件,並使用git add。或git add <文件>。 你想要什麼: 從索引中刪除文件,但保持版本化,並保留工作副本中未提交的更改: git reset HEAD <文件> 將文件重置為HEAD的最後一個狀態,撤消更改並將其從索引中刪除: #認為`svn revert `IIRC。 git reset HEAD <文件> git checkout <文件> #如果您有一個名為 的` `,請使用: git checkout-<文件> 這是必需的,因為git reset --hard HEAD不適用於單個文件。 從索引和版本控制中刪除 ,保留未版本化的文件以及工作副本中的更改: git rm-緩存<文件> 從工作副本和版本中完全刪除 : git rm <文件> | 如果您正在進行初次提交,則不能使用git重置,只需聲明“ Git破產”並刪除.git文件夾並重新開始 | 根據許多其他答案,您可以使用git reset 但: 我發現了這篇很棒的小文章,實際上為git unadd添加了Git命令(還有一個別名):有關詳細信息,請參見git unadd。 只是, git config --global alias.unadd“重置頭” 現在你可以 git unadd foo.txt bar.txt | 使用git add -i從您即將提交的提交中刪除剛添加的文件。例: 添加您不需要的文件: $ git add foo $ git狀態 #在分支主管上 #要提交的更改: #(使用“ git reset HEAD <文件> ...”取消登台) # #新文件:foo # #未跟踪的文件: #(使用“ git add <文件> ...”包含在將提交的內容中) #[...]# 進入交互式添加以撤消添加(在git此處鍵入的命令是“ r”(還原),“ 1”(列表還原中的第一項顯示),“返回”以退出還原模式和“ q” (放棄): $ git add -i 分階段未分階段的路徑 1:+ 1 / -0沒什麼foo ***命令*** 1:[狀態] 2:[正常] 3:[逆轉] 4:[a] dd未跟踪 5:[p]補6:[d] iff 7:[q] uit 8:[h] elp 現在怎麼辦 分階段未分階段的路徑 1:+ 1 / -0無[f] oo 還原>> 1 分階段未分階段的路徑 * 1:+ 1 / -0無[f] oo 還原>> 注意:foo現在未被跟踪。 恢復一條路 ***命令*** 1:[狀態] 2:[正常] 3:[逆轉] 4:[a] dd未跟踪 5:[p]補6:[d] iff 7:[q] uit 8:[h] elp 現在怎麼辦 再見 $ 而已!這是您的證明,表明“ foo”又回到了未跟踪列表中: $ git狀態 #在分支主管上 #未跟踪的文件: #(使用“ git add <文件> ...”包含在將提交的內容中) #[...] #foo 沒有添加任何內容提交但存在未跟踪的文件(使用“ git add”進行跟踪) $ | 可以使用git remove或git rm,帶有--cached標誌。嘗試: git help rm | 當您開始一個新項目時,這是一種避免此煩惱的方法: 為新項目創建主目錄。 運行git init。 現在創建一個.gitignore文件(即使它是空的)。 提交您的.gitignore文件。 如果您沒有任何提交,Git會使執行git reset變得非常困難。如果您只是為了擁有一個而創建一個微小的初始提交,那麼您可以根據需要進行git add -A和git reset多次,以使所有操作正確。 此方法的另一個優點是,如果以後遇到行尾麻煩並且需要刷新所有文件,則很容易: 簽出該初始提交。這將刪除您的所有文件。 然後再次檢查您最近的提交。這將使用您當前的行尾設置來檢索文件的新副本。 | 自您發布問題以來,也許Git已經發展。 $> git --version git版本1.6.2.1 現在,您可以嘗試: git reset HEAD。 這應該是您想要的。 | 請注意,如果您未能指定修訂版本,則必須包含分隔符。我的控制台示例: git reset <文件路徑> 致命:參數“ ”不明確:修訂版本未知或不在工作樹中的路徑。 使用“-”將路徑與修訂分開 git reset-<文件路徑> 重置後的未分級更改: M <文件路徑> (Git版本1.7.5.4) | 如上所述,要從登台區域刪除新文件(並且僅在新文件的情況下): git rm-緩存的文件 rm --cached僅用於意外添加的新文件。 | 要重置特定文件夾(及其子文件夾)中的每個文件,可以使用以下命令: git reset * | 使用*命令一次處理多個文件: git reset HEAD * .prj git reset HEAD * .bmp git reset HEAD * gdb * 等等 | 只需輸入git reset,它就會還原,就像您從未輸入git add一樣。自上次提交以來。確保您之前已作出承諾。 | 假設我創建一個新文件newFile.txt: 假設我不小心添加了文件,git add newFile.txt: 現在我想撤消此添加,在提交之前,git reset newFile.txt: | 對於特定文件: git reset my_file.txt git checkout my_file.txt 對於所有添加的文件: git reset。 git checkout。 注意:檢出會更改文件中的代碼,並移至上次更新(提交)狀態。重置不會更改代碼;它只是重置標題。 | 要撤消git add,請使用: git reset文件名 | 此命令將取消存儲您的更改: git reset HEAD filename.txt文件 您也可以使用 git添加-p 添加文件的一部分。 | 還有交互模式: git添加-i 選擇選項3取消添加文件。就我而言,我經常想添加多個文件,並且在交互模式下,您可以使用像這樣的數字來添加文件。除了4:1、2、3和5外,這將佔用所有其他內容 要選擇一個序列,只需輸入1-5即可將1取為5。 Git暫存文件 | git add myfile.txt#這會將您的文件添加到待提交列表中 與該命令完全相反的是, git reset HEAD myfile.txt#這將撤消它。 因此,您將處於以前的狀態。指定將再次出現在未跟踪列表中(以前的狀態)。 它將使用該指定文件重置您的頭部。因此,如果您的頭部沒有此功能,它將簡單地將其重置。 | git reset filename.txt 將從當前索引的“即將提交”區域中刪除一個名為filename.txt的文件,而不進行任何其他更改。 | git reset filename.txt 將從當前索引的“即將提交”區域中刪除一個名為filename.txt的文件,而不進行任何其他更改。 | 在Sourcetree中,您可以通過GUI輕鬆完成此操作。 您可以檢查Sourcetree用於取消暫存文件的命令。 我創建了一個新文件並將其添加到Git。然後,我使用Sourcetree GUI取消登台。 結果如下: 正在取消暫存文件[15/12/15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q-路徑/到/文件/文件名.java Sourcetree使用reset取消登台新文件。 | 1個 2 下一個 高度活躍的問題。贏得10個聲譽才能回答這個問題。信譽要求有助於保護該問題免受垃圾郵件和非答復活動的侵害。 不是您要找的答案?瀏覽其他標記為git version-control git-commit git-stage的問題,或詢問您自己的問題。